macos: fix discover of surface under cursor
authorChristian Hergert <chergert@redhat.com>
Wed, 14 Oct 2020 23:59:38 +0000 (16:59 -0700)
committerChristian Hergert <chergert@redhat.com>
Wed, 14 Oct 2020 23:59:38 +0000 (16:59 -0700)
This was incorrectly reporting the toplevel surface instead of the
popup surface that was placed above it. This fixes event delivery
to popups for selecting menu items and more.

gdk/macos/gdkmacosdisplay-translate.c

index 5ed44d3592632a10beae6f1edc57c88afb321da4..a828f127d9f2eee4b0196a90855285bec1cb2c4b 100644 (file)
@@ -713,29 +713,23 @@ find_surface_under_pointer (GdkMacosDisplay *self,
                             int             *y)
 {
   GdkPointerSurfaceInfo *info;
-  GdkSurface *surface;
+  GdkMacosSurface *found;
+  GdkSurface *surface = NULL;
   GdkSeat *seat;
   int x_tmp, y_tmp;
 
   seat = gdk_display_get_default_seat (GDK_DISPLAY (self));
   info = _gdk_display_get_pointer_info (GDK_DISPLAY (self),
                                         gdk_seat_get_pointer (seat));
-  surface = info->surface_under_pointer;
 
-  if (surface == NULL)
+  if ((found = _gdk_macos_display_get_surface_at_display_coords (self,
+                                                                 screen_point.x,
+                                                                 screen_point.y,
+                                                                 &x_tmp,
+                                                                 &y_tmp)))
     {
-      GdkMacosSurface *found;
-
-      found = _gdk_macos_display_get_surface_at_display_coords (self,
-                                                                screen_point.x,
-                                                                screen_point.y,
-                                                                &x_tmp, &y_tmp);
-
-      if (found)
-        {
-          surface = GDK_SURFACE (found);
-          info->surface_under_pointer = g_object_ref (surface);
-        }
+      g_set_object (&info->surface_under_pointer, surface);
+      surface = GDK_SURFACE (found);
     }
 
   if (surface)